package com.order.service.lmpl;

import com.order.mapper.OrderMapper;
import com.usian.appraise.Appraise;
import com.usian.order.Order;
import com.order.service.OrderService;
import com.usian.pay.AliPay;
import com.usian.scenic.Scenic;
import com.usian.travelSchedule.TravelSchedule;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 35286
 */
@Service
public class OrderServicelmpl implements OrderService{
    @Autowired
    private OrderMapper orderMapper;

    /**
     * 根据用户ID和订单状态选择订单
     * 此方法用于查询特定用户的所有订单，或查询特定状态下所有用户的订单
     *
     * @param id 用户ID，用于指定查询的用户如果为null，则不按用户ID过滤
     * @param status 订单状态，用于指定查询的订单状态如果为null，则不按订单状态过滤
     * @return 返回符合条件的订单列表如果无符合条件的订单，则返回空列表
     */
    @Override
    public List<Order> selectOrder(Integer id, Integer status) {
        return orderMapper.selectOrder(id, status);
    }

    /**
     * 根据用户ID和订单状态选择已接单的订单
     * 此方法专注于查询已接单状态的订单，适用于需要区分订单是否已被处理的场景
     *
     * @param id 用户ID，用于指定查询的用户如果为null，则不按用户ID过滤
     * @param status 订单状态，用于指定查询的订单状态如果为null，则不按订单状态过滤
     * @return 返回符合条件的已接单订单列表如果无符合条件的订单，则返回空列表
     */
    @Override
    public List<Order> selectTakeOrder(Integer id, Integer status) {
        return orderMapper.selectTakeOrder(id, status);
    }

    @Override
    /**
     * 根据地址选择景点订单
     *
     * 该方法接收一个地址字符串，该字符串包含多个地址，地址之间用逗号分隔
     * 它会将每个地址单独取出，然后调用orderMapper的selectScenicOrder方法来获取每个地址的景点信息
     * 最后，将所有地址对应的景点信息汇总到一个列表中并返回
     *
     * @param addres 包含多个地址的字符串，地址之间用逗号分隔
     * @return 包含所有选定景点的列表
     */
    public List<Scenic> selectScenicOrder(String addres) {
        // 将输入的地址字符串按逗号分割成地址列表
        List<String>  addresList= List.of(addres.split(","));
        // 创建一个空的ArrayList来存储所有的景点信息
        ArrayList<Scenic> arrayList = new ArrayList<>();
        // 遍历地址列表，为每个地址获取景点信息
        for (String s : addresList) {
           // 调用orderMapper的selectScenicOrder方法获取当前地址的景点列表
           List<Scenic> scenic = orderMapper.selectScenicOrder(s);
            // 将当前地址的景点信息添加到总的景点列表中
            for (Scenic scenic1 : scenic) {
                arrayList.add(scenic1);
            }
        }
        // 返回包含所有选定景点的列表
        return arrayList;
    }

    @Override
    public TravelSchedule selectTravel(Integer addressId) {
        return orderMapper.selectTravel(addressId);
    }

    @Override
    public int deleteStatus(Integer id, int orderStatus) {
        return orderMapper.deleteStatus(id,orderStatus);
    }

    @Override
    public int saveOrder(Order order) {
        order.setOrderStatus(0);
        order.setAmount(19.19);
        return orderMapper.saveOrder(order);
    }

    @Override
    public Integer selectTravelOrderStatuslook(Integer id) {
        Order order = orderMapper.selectOrders(id, 2);
        if (order!=null){
            return orderMapper.selectTravelOrderStatuslook(id);
        }
        return null;
    }

    @Override
    public int updateByStatus(Integer id, Integer orderStatus,Integer userId) {
        return orderMapper.updateByStatus(id, orderStatus,userId);
    }

    @Override
    public List<Order> selectTakeOrders(Integer id, Integer status) {
        return orderMapper.selectTakeOrders(id, status);
    }

    @Override
    public Integer selectPay(Integer id) {
        return orderMapper.skipPayment(id);
    }

    @Override
    public List<Order> getUnacceptedOrders(Integer orderStatus) {
        return orderMapper.getUnacceptedOrders(orderStatus);
    }

    @Override
    public Integer selectById(Integer tradeid, Integer id) {
        AliPay pay = orderMapper.selectPay(tradeid);
        if (pay!=null){
            Integer i = orderMapper.deleteStatus(id, 4);
            if (i>0){
                return i;
            }
        }
        return null;
    }

    @Override
    public Integer appraise(Integer designerId, Integer userid, Integer orderid, Appraise appraise) {
       int a = orderMapper.saveaddressId(designerId,userid,appraise.getScores(),appraise.getContent());
      int b =  orderMapper.deleteStatus(orderid,5);
      Order order = orderMapper.selectOrders(orderid,5);
        TravelSchedule travelSchedule = orderMapper.selectTravel(order.getAddressId());
        if(travelSchedule!=null){
            orderMapper.updateserviceTimes(travelSchedule.getDesignerId());
        }
        if (a>0&&b>0){
          return 1;
      }else {
          return null;
      }
    }
}
